// 封装通用网络请求
// 安装axios $ npm i axios -s
import axios from "axios";
import {
    Notify,
    Toast
} from 'vant'; // ⚪️ 1-1 消息提示组件
import router from "@/router";
import {
    getToken,
    removeToken
} from "@/utils/auth";

axios.defaults.headers["Content-Type"] = "application/json";

export function request(config) {
    const instance = axios.create({
        // baseURL: 'http://192.168.1.19:2034/', // 根路径，网关统一入口路径
        // baseURL: 'http://119.45.149.156:2026/', // 根路径，网关统一入口路径
        baseURL: 'http://ybj.tjxdezx.cn/', // 根路径，网关统一入口路径
        timeout: 20000 // 请求超时时间，请求达到20秒，不让请求
    })

    // 请求拦截
    instance.interceptors.request.use(config => {
        // 如果有一个接口需要认证才可以访问，就在这里统一设置
        // 使用 JWT 认证: 取出用户登录时存的 token 放到请求头
        const token = getToken();
        if (token) { // 如果token存在
            // Authorization: Bearer Token ; key : value
            // 在headers头部加上Authorization属性，把token带到服务器里面
            // config.headers.token = token.Token // Bearer 右边有一个空格
            // config.headers.memberId = token.ID // Bearer 右边有一个空格      
            config.headers.Authorization_Token = `Bearer ${token}`;// 根据实际情况调整token的命名，常见的有 Authorization 或 Token
        }
        // 放行
        return config;
    }, error => {
        // 什么也不要做
    })

    // 响应拦截
    instance.interceptors.response.use(res => {
        console.log(res.data);
        if (res.data) {
            if (res.data.Code == -2) {
                removeToken();
                router.push({
                    path: '/login'
                })
                Notify('登录已失效，请重新登录');
            }
        }
        return res.data ? res.data : res; // 封装获取数据 data 路径
    }, err => {
        console.log("响应拦截",err);
        // 如果有需要授权才可以访问的接口，统一去 login 授权
        if (err.response.status === 401) {
            removeToken();
            router.push({
                path: '/login'
            })
            Notify('登录已失效，请重新登录');
        }
        // 如果后端接口有错误提示消息，这里统一处理,显示错误信息
        // console.log(err)
        // 通过err.response响应数据里面的错误，拿到Object键里面的错误信息
        // Notify(err.response.data.errors[Object.keys(err.response.data.errors)[0]][0]);
    })
    return instance(config)
}